package com.pisces.tool.util;

import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;


public class UnicodeUtil {

	public UnicodeUtil() {
	}
	
	
	public static String UrlEncode(String str){
		try {
			return URLEncoder.encode(URLEncoder.encode(str,"UTF-8"),"UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static String UrlDecode(String str){
		try {
			return URLDecoder.decode(str, "UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * utf-8 转换成 unicode
	 */
	public static String utf8ToUnicode(String inStr) {
		char[] myBuffer = inStr.toCharArray();

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < inStr.length(); i++) {
			Character.UnicodeBlock ub = Character.UnicodeBlock.of(myBuffer[i]);
			if (ub == Character.UnicodeBlock.BASIC_LATIN) {
				// 英文及数字等
				sb.append(myBuffer[i]);
			} else if (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
				// 全角半角字符
				int j = (int) myBuffer[i] - 65248;
				sb.append((char) j);
			} else {
				// 汉字
				short s = (short) myBuffer[i];
				String hexS = Integer.toHexString(s);
				String unicode = "\\u" + hexS;
				sb.append(unicode.toLowerCase());
			}
		}
		return sb.toString().replaceAll("ffff", "");
	}

	public static String utf8ToUnicodeJS(String inStr) {
		char[] myBuffer = inStr.toCharArray();

		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < inStr.length(); i++) {
			Character.UnicodeBlock ub = Character.UnicodeBlock.of(myBuffer[i]);
			if (ub == Character.UnicodeBlock.BASIC_LATIN) {
				// 英文及数字等
				sb.append(myBuffer[i]);
			} else if (ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
				// 全角半角字符
				int j = (int) myBuffer[i] - 65248;
				sb.append((char) j);
			} else {
				// 汉字
				short s = (short) myBuffer[i];
				String hexS = Integer.toHexString(s);
				String unicode = "\\\\u" + hexS;
				sb.append(unicode.toLowerCase());
			}
		}
		return sb.toString().replaceAll("ffff", "");
	}

	/**
	 * unicode 转换成 utf-8
	 *
	 * @author fanhui 2007-3-15
	 * @param theString
	 * @return
	 */
	public static String unicodeToUtf8(String theString) {
		char aChar;
		String str = theString;
		int len = theString.length();
		StringBuffer outBuffer = new StringBuffer(len);

		try {
			if (theString.indexOf("\\") == -1) {
				int l = theString.length() / 5;
				StringBuffer sb = new StringBuffer();
				for (int i = 0; i < l; i++) {
					sb.append("\\" + theString.substring(i * 5, (i * 5) + 5));
				}
				theString = sb.toString();
			}
			for (int x = 0; x < len;) {
				aChar = theString.charAt(x++);
				if (aChar == '\\') {
					aChar = theString.charAt(x++);
					if (aChar == 'u') {
						// Read the xxxx
						int value = 0;
						for (int i = 0; i < 4; i++) {
							aChar = theString.charAt(x++);
							switch (aChar) {
							case '0':
							case '1':
							case '2':
							case '3':
							case '4':
							case '5':
							case '6':
							case '7':
							case '8':
							case '9':
								value = (value << 4) + aChar - '0';
								break;
							case 'a':
							case 'b':
							case 'c':
							case 'd':
							case 'e':
							case 'f':
								value = (value << 4) + 10 + aChar - 'a';
								break;
							case 'A':
							case 'B':
							case 'C':
							case 'D':
							case 'E':
							case 'F':
								value = (value << 4) + 10 + aChar - 'A';
								break;
							default:
								throw new IllegalArgumentException(
										"Malformed   \\uxxxx   encoding.");
							}
						}
						outBuffer.append((char) value);
					} else {
						if (aChar == 't')
							aChar = '\t';
						else if (aChar == 'r')
							aChar = '\r';
						else if (aChar == 'n')
							aChar = '\n';
						else if (aChar == 'f')
							aChar = '\f';
						outBuffer.append(aChar);
					}
				} else
					outBuffer.append(aChar);
			}
		} catch (RuntimeException e) {
			// e.printStackTrace();
			return str;
		}
		return outBuffer.toString();
	}
	
	public static final void main(String[] args) {
		System.out.println(utf8ToUnicode("™"));
		System.out.println(utf8ToUnicode("五金配件"));
		System.out.println(utf8ToUnicodeJS("五金配件"));
		System.out.println(unicodeToUtf8("leer\u5e02\u8f96\u533a计量"));
		System.out.println(unicodeToUtf8("\u4e94\u91d1\u914d\u4ef6"));
		System.out.println(unicodeToUtf8("\\u4e94\\u91d1\\u914d\\u4ef6"));
	}


}
